package plp.orientadaObjetos2.expressao.binaria;

import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ClasseNaoDeclaradaException;
import plp.orientadaObjetos1.excecao.declaracao.ObjetoNaoDeclaradoException;
import plp.orientadaObjetos1.expressao.Expressao;
import plp.orientadaObjetos1.expressao.binaria.ExpBinaria;
import plp.orientadaObjetos1.expressao.valor.Valor;
import plp.orientadaObjetos1.expressao.valor.ValorBooleano;
import plp.orientadaObjetos1.expressao.valor.ValorInteiro;
import plp.orientadaObjetos1.memoria.AmbienteCompilacaoOO1;
import plp.orientadaObjetos1.memoria.AmbienteExecucaoOO1;
import plp.orientadaObjetos1.util.Tipo;
import plp.orientadaObjetos1.util.TipoPrimitivo;

public class ExpMaiorQue extends ExpBinaria {

	public ExpMaiorQue(Expressao esq, Expressao dir) {
		super(esq, dir, ">");
	}

	@Override
	public Valor avaliar(AmbienteExecucaoOO1 ambiente)
			throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException,
			ObjetoNaoDeclaradoException, ClasseNaoDeclaradaException {
		int valorEsq = ((ValorInteiro) this.getEsq().avaliar(ambiente)).valor();
		int valorDir = ((ValorInteiro) this.getDir().avaliar(ambiente)).valor();
		return new ValorBooleano(valorEsq > valorDir);
	}

	@Override
	public Tipo getTipo(AmbienteCompilacaoOO1 ambiente)
			throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException {
		return TipoPrimitivo.TIPO_BOOLEANO;
	}

	@Override
	public boolean checaTipo(AmbienteCompilacaoOO1 ambiente)
			throws VariavelNaoDeclaradaException, ClasseNaoDeclaradaException {
		return super.checaTipo(ambiente) &&
				this.getEsq().getTipo(ambiente).equals(TipoPrimitivo.TIPO_INTEIRO) &&
				this.getEsq().getTipo(ambiente).equals(this.getDir().getTipo(ambiente));
	}
}
